﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using MakeIT.MiraPark.Negocios;

namespace MiraPark
{
    public partial class FormFechamentoCaixa : Form
    {
        CabineVO cabineVO = null;
        UsuarioVO usuarioVO = null;

        public FormFechamentoCaixa()
        {
            InitializeComponent();
        }
        public void setCabine(CabineVO cabineVO, UsuarioVO usuarioVO)
        {
            this.cabineVO = cabineVO;
            this.usuarioVO = usuarioVO;
        }


        private void FormFechamentoCaixa_Load(object sender, EventArgs e)
        {
            DialogResult dr = MessageBox.Show("Confirma a execução do fechamento?", "Confirmação", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            if (dr.ToString().Equals("No"))
            {
                this.Close();
                return;
            }

            StringBuilder mensagem = new StringBuilder();

            List<MovimentacaoVO> listMovimentacaoVOs = ModelBO.getMovimentacoes(null, cabineVO.idCabine, null, null, null, null, null, false, true, null, false, false, true, false, false);
            List<CabineXMovimentoVO> listCabineXMovimentoVO = new List<CabineXMovimentoVO>();

            Decimal saldo = ModelBO.getCabineSaldo(cabineVO.idCabine);

            foreach (MovimentacaoVO movimentacaoVO in listMovimentacaoVOs)
            {
                List<RecebimentoVO> listRecebimentoVO = ModelBO.getRecebimentos(null, movimentacaoVO.idMovimentacao, null, null, false, false, null, null, null, null);
                string movimento = movimentacaoVO.especie;
                if (listRecebimentoVO.Count > 0 && listRecebimentoVO[0].formaPagamentoVO.formaPagamento != null)
                    movimento = listRecebimentoVO[0].formaPagamentoVO.formaPagamento;

                CabineXMovimentoVO cabineXMovimentoVO = listCabineXMovimentoVO.Find(cm => cm.movimento.Equals(movimento));
                if (cabineXMovimentoVO == null)
                {
                    cabineXMovimentoVO = CabineXMovimentoVO.CreateCabineXMovimentoVO();
                    cabineXMovimentoVO.movimento = movimento;
                    cabineXMovimentoVO.idCabine = cabineVO.idCabine;
                    cabineXMovimentoVO.dataMov = DateTime.Now;
                    listCabineXMovimentoVO.Add(cabineXMovimentoVO);
                    while (cabineXMovimentoVO.dataMov.AddSeconds(1) > DateTime.Now) { }
                }

                if (movimentacaoVO.valor > 0)
                    cabineXMovimentoVO.credito += movimentacaoVO.valor;
                else
                    cabineXMovimentoVO.debito -= movimentacaoVO.valor * -1;

                movimentacaoVO.fechCabine = true;
            }

            mensagem.Append(Ticket.getHeader());
            mensagem.AppendLine(DateTime.Now.ToString());
            mensagem.AppendLine("Fechamento de Caixa");
            mensagem.AppendLine("================================================");
            mensagem.AppendLine("Patio: " + cabineVO.idPatio + " - " + cabineVO.patioVO.patio);
            mensagem.AppendLine("Cabine: " + cabineVO.idCabine + " - " + cabineVO.cabine);
            mensagem.AppendLine("Operador:" + "x-xxxx");
            mensagem.AppendLine("================================================");
            mensagem.AppendLine("");
            
            mensagem.AppendLine("Total de Recebimentos");
            mensagem.AppendLine("=============================CRED========DEB====");
            foreach (CabineXMovimentoVO cabineXMovimentoVO in listCabineXMovimentoVO)
            {
                saldo += cabineXMovimentoVO.credito;
                saldo += cabineXMovimentoVO.debito;

                cabineXMovimentoVO.saldo = saldo;
                mensagem.AppendLine("\t" + cabineXMovimentoVO.movimento.PadRight(15) + " " + cabineXMovimentoVO.credito.ToString().PadLeft(10) + " " + ((cabineXMovimentoVO.debito * -1).ToString().PadLeft(10)));
            }
            mensagem.AppendLine("------------------------------------------------");
            mensagem.AppendLine("\t\tSaldo Final: " + saldo);
            mensagem.AppendLine("");

            //Gravar
            foreach (MovimentacaoVO movimentacaoVO in listMovimentacaoVOs)
            {
                ModelBO.setMovimentacao(movimentacaoVO);
            }
            foreach (CabineXMovimentoVO cabineXMovimentoVO in listCabineXMovimentoVO)
            {
                ModelBO.newCabineXMovimento(cabineXMovimentoVO);
            }

            mensagem.AppendLine("");
            mensagem.AppendLine("Conferido por:");

            mensagem.Append(Ticket.getFooter(false, cabineVO, usuarioVO));

            this.textBoxResult.Text = mensagem.ToString();

            MessageBox.Show("Fechamento executado", "Aviso");

        }

        private void buttonFecharJanela_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            while (true)
            {
                if (!Ticket.checkPrint() || !Ticket.printTicket(this.textBoxResult.Text))
                {
                    DialogResult dr = MessageBox.Show(this, "Tentar novamente?", "Confirmação", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                    if (dr.ToString().Equals("Yes"))
                    {
                        continue;
                    }
                    else
                    {
                        break;
                    }
                }
                else
                {
                    break;
                }
            }


        } 
    }
}
